バックアップシステム構築
概要:Linuxサーバー内システムファイルやデータなどの自動バックアップを行う。(tar+GnuPG)
ここでは、サーバー内データをtarコマンドで圧縮してバックアップ先ディレクトリへ退避しておき、指定により、退避したバックアップを管理者以外が参照できないようにGnuPGコマンドで暗号化もできるようにする。
なお、サーバー内のバックアップは定期的に自動で行う。
1. サーバー側(Linux)でのバックアップ設定
- ) バックアップスクリプト作成
# vi backup.sh ← バックアップスクリプト作成
#!/bin/bash
#
# ローカル内でバックアップ
#
LANG=C
#
# 設定開始
#
# バックアップ対象リスト名
# ※バックアップ対象をフルパスで記述したリスト
BACKUPLIST=/root/backuplist
[ ! -s $BACKUPLIST ] && echo "$BACKUPLIST is not found" && error_exit
# バックアップ対象外リスト名
# ※バックアップ対象外をフルパスで記述したリスト
BACKUPNOLIST=/root/backupnolist
# バックアップ先ディレクトリ名
BACKUPDIR=/backup
mkdir -p $BACKUPDIR
# バックアップ保存世代数
# ※当日分を含めた過去分バックアップを保存する世代数
# ※過去分バックアップを保存しない場合は1を指定する
BACKUPGEN=8
# 暗号化・復号化パスフレーズ
# ※指定がないときは暗号化しない
PASS=''
# バックアップログファイル名
BACKUPLOG=/var/log/backup.log
#
# 設定終了
#
# 異常終了処理関数定義
error_exit () {
rm -f $TMPBACKUPNOLIST
exit 1
}
# バックアップファイルをバックアップ対象外リストに追加
# ※バックアップ先ファイルをバックアップしないようにする
TMPBACKUPNOLIST=`mktemp`
[ -s $BACKUPNOLIST ] && cat $BACKUPNOLIST > $TMPBACKUPNOLIST
echo "$BACKUPDIR/*backup.tar.bz2" >> $TMPBACKUPNOLIST
# 前回バックアップをリネーム
cd $BACKUPDIR
OLDBACKUPFILE=`ls backup.tar.bz2* 2>/dev/null`
if [ -f $OLDBACKUPFILE ]; then
TIMESTAMP=`ls --full-time $OLDBACKUPFILE|awk '{print $6}'|tr -d -`
mv $BACKUPDIR/$OLDBACKUPFILE $BACKUPDIR/${TIMESTAMP}$OLDBACKUPFILE > /dev/null 2>&1
fi
# バックアップログファイル作成
rm -f $BACKUPLOG
touch $BACKUPLOG
chmod 400 $BACKUPLOG
# バックアップ実行
echo "`date` backup start" >> $BACKUPLOG
tar cjvfP $BACKUPDIR/backup.tar.bz2 -T $BACKUPLIST -X $TMPBACKUPNOLIST >> $BACKUPLOG 2>&1
code=$?
if [ $code -ne 0 ]; then
cat $BACKUPLOG | mail -s "BACKUP NG CODE IS $code" root
rm -f $BACKUPDIR/backup.tar.bz2
error_exit
fi
echo "`date` backup end" >> $BACKUPLOG
# バックアップ暗号化(暗号化・復号化パスフレーズ指定時のみ)
if [ ! -z $PASS ]; then
echo "`date` encrypt start" >> $BACKUPLOG
mkdir -p $HOME/.gnupg
echo $PASS|gpg --passphrase-fd 0 --batch -c $BACKUPDIR/backup.tar.bz2 > /dev/null 2>&1
code=$?
if [ $code -ne 0 ]; then
cat $BACKUPLOG | mail -s "BACKUP NG CODE IS $code" root
rm -f $BACKUPDIR/backup.tar.bz2*
error_exit
fi
rm -f $BACKUPDIR/backup.tar.bz2
echo "`date` encrypt end" >> $BACKUPLOG
fi
# バックアップ保存世代を超えた古いバックアップを削除
if [ $(ls $BACKUPDIR/*backup.tar.bz2*|wc -l) -gt $BACKUPGEN ]; then
OLDBACKUPCNT=`expr $(ls $BACKUPDIR/*backup.tar.bz2*|wc -l) - $BACKUPGEN`
for file in `ls -t $BACKUPDIR/*backup.tar.bz2*|tail -n $OLDBACKUPCNT`
do
rm -f $file
done
fi
# バックアップ対象外リスト削除
rm -f $TMPBACKUPNOLIST
# chmod 700 backup.sh ← バックアップスクリプトへ実行権限付加
- ) バックアップ対象リスト作成
バックアップ対象ディレクトリ、ファイルを登録したバックアップ対象リストを作成する
# echo "/home" >> backuplist ← 例としてバックアップ対象リストに
/homeディレクトリを追加
# echo "/root" >> backuplist
# echo "/var/www" >> backuplist
- ) バックアップ対象外リスト作成
バックアップ対象ディレクトリ内のバックアップ対象外ディレクトリ、ファイルを登録したバックアップ対象外リストを作成する。
注:バックアップ対象外とするディレクトリ、ファイルがなければ作成しなくてもよい
# echo "/var/www/error" >> backupnolist ← 例としてバックアップ対象外リストに
/var/www/errorディレクトリを追加
# echo "/var/www/icons" >> backupnolist
# echo "/var/www/manual" >> backupnolist
2. バックアップスクリプト確認
- ) バックアップスクリプト確認
# ./backup.sh ← バックアップスクリプト実行
# ls -lh /backup ← バックアップ先ディレクトリ照会
合計 692K
-rw-r--r-- 1 root root 688K 6月 23 10:42 backup.tar.bz2.gpg
← バックアップファイル(暗号化した場合)
-rw-r--r-- 1 root root 688K 6月 23 10:42 backup.tar.bz2
← バックアップファイル(暗号化しない場合)
注:最新バックアップのファイル名は/backup /backup.tar.bz2で、前回バックアップのファイル名は前日日付にリネームされ(例:/backup /20051126backup.tar.bz2)、7日間保存されます。
- ) 復号化確認(暗号化した場合のみ)
# gpg /backup/backup.tar.bz2.gpg ← 復号化
gpg: 鍵輪「/root/.gnupg/secring.gpg」ができました ←最初の1回のみ表示される
gpg: CAST5暗号化済みデータ
パスフレーズを入力: ← 暗号化・復号化パスフレーズ応答
gpg: 1 個のパスフレーズで暗号化
gpg: 警告: メッセージの完全性は保護されていません
# ls -lh /backup ← バックアップ先ディレクトリ照会
合計 1.4M
-rw-r--r-- 1 root root 690K 6月 23 10:46 backup.tar.bz2 ← 復号化されている
-rw-r--r-- 1 root root 688K 6月 23 10:42 backup.tar.bz2.gpg
- ) バックアップ内容確認
# tar tjvf /backup/backup.tar.bz2 ← バックアップディレクトリ、ファイル確認
バックアップしたディレクトリ、ファイルが一覧表示される。
3. バックアップ定期自動実行設定
- ) 定期自動実行設定
クーロンにバックアップ定期自動実行設定を追加する。
例:毎日5:00にバックアップを実行する場合。
# echo "0 5 * * * root /root/backup.sh" > /etc/cron.d/backup
- ) データベースバックアップとの連携
# echo "/backup/mysql" >> backuplist
← バックアップ対象リストに/backup/mysqlディレクトリを追加。
# echo "0 5 * * * root /root/mysql-backup.sh ; /root/backup.sh" > /etc/cron.d/backup
← 毎日5:00にデータベースバックアップ、バックアップの順に実行する。
4. バックアップ・リストア確認
バックアップからディレクトリ単位、ファイル単位でリストア(復元)できるか確認する。
- ) テスト用ディレクトリ、ファイル作成
# su - apladmin
$ touch /home/apladmin/test.cgi
$ chmod 755 /home/apladmin/test.cgi
$ mkdir /home/apladmin/test
$ cp /home/apladmin/test.cgi /home/apladmin/test/
$ ll -R /home/apladmin/
# touch /home/centos/test.cgi ← centosのホームディレクトリにテスト用ファイルを作成
# chmod 755 /home/centos/test.cgi
← 上記テスト用ファイルのパーミッションをCGIのように755に変更
# mkdir /home/centos/test ← centosのホームディレクトリにテスト用ディレクトリ作成
# cp /home/centos/test.cgi /home/centos/test/
← 上記テスト用ディレクトリにテスト用ファイルコピー
# chown -R centos:centos /home/centos/
← 作成したテスト用ディレクトリ、ファイルの所有者を変更
# ll -R /home/centos/ ← テスト用ディレクトリ、ファイル作成確認
/home/centos/:
/home/centos/:
合計 4
drwxr-xr-x 2 centos centos 4096 10月 27 14:19 test ← テスト用ディレクトリ
-rwxr-xr-x 1 centos centos 0 10月 27 14:19 test.cgi ← テスト用ファイル
/home/centos/test:
合計 0
-rwxr-xr-x 1 centos centos 0 10月 27 14:19 test.cgi ← テスト用ディレクトリ内ファイル
- ) バックアップ実行
# ./backup.sh ← バックアップスクリプト実行
- ) テスト用ディレクトリ、ファイル削除
# rm -rf /home/centos/test/ ← テスト用ディレクトリ削除
# rm -f /home/centos/test.cgi ← テスト用ファイル削除
# ll -R /home/centos/ ← テスト用ディレクトリ、ファイル削除確認
/home/centos/:
合計 0
- ) テスト用ディレクトリ、ファイル復元
# tar jxvfP /backup/backup.tar.bz2 /home/centos/test ← テスト用ディレクトリ復元
/home/centos/test/
/home/centos/test/test.cgi
# tar jxvfP /backup/backup.tar.bz2 /home/centos/test.cgi ← テスト用ファイル復元
/home/centos/test.cgi
# ll -R /home/centos/ ← テスト用ディレクトリ、ファイル復元確認
/home/centos/:
合計 4
drwxr-xr-x 2 centos centos 4096 10月 27 14:19 test
← テスト用ディレクトリがパーミッション、所有者も含めて復元されること。
-rwxr-xr-x 1 centos centos 0 10月 27 14:19 test.cgi
← テスト用ファイルがパーミッション、所有者も含めて復元されること。
/home/centos/test:
合計 0
-rwxr-xr-x 1 centos centos 0 10月 27 14:19 test.cgi
← テスト用ディレクトリ内ファイルがパーミッション、所有者も含めて復元されること。